/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package manager.auxiliares;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.LinkedList;
import javax.swing.JComboBox;
import manager.principal.fonte.JanelaLogin;

/**
 *
 * @author diego1
 */
public class DateFormat {

    private static final int anoMesInstalação = 200905;

    public static LinkedList<String> getDiferencaMesAno(String mesAnoInicio, String mesAnoFim) {
        LinkedList<String> mesAno = new LinkedList<String>();
        while (Integer.parseInt(mesAnoInicio) <= Integer.parseInt(mesAnoFim)) {
            mesAno.add(mesAnoInicio);
            int mes = Integer.parseInt(mesAnoInicio.substring(4, 6));
            mes++;
            String mesAux = Integer.toString(mes);
            if (mes < 10) {
                mesAux = "0" + Integer.toString(mes);
            }
            int ano = Integer.parseInt(mesAnoInicio.substring(0, 4));
            if (mes > 12) {
                ano++;
                mesAux = "01";
            }
            String anoAux = Integer.toString(ano);
            mesAnoInicio = anoAux + mesAux;
        }
        return mesAno;
    }

    public static LinkedList<String> getUltimosAnoMes() {
        LinkedList<String> listaAnoMes = new LinkedList<String>();
        String data = "";
        try {
            Statement stm = JanelaLogin.getConnection().createStatement();
            ResultSet rs = stm.executeQuery("SELECT CURDATE();");
            if (rs.first()) {
                data = rs.getString(1).replace("-", "");
            }
            rs.close();
            stm.close();
        } catch (Exception e) {
        }
        listaAnoMes.add(data.substring(0, 6));
        int anoMesAtual = Integer.parseInt(data.substring(0, 6));
        int anoAtual = Integer.parseInt(getAnoAtual() + "00");
        for (int i = 0; i < 11; i++) {
            anoMesAtual = anoMesAtual - 1;
            if ((anoMesAtual <= anoAtual) && (anoMesAtual > anoMesInstalação)) {
                listaAnoMes.add(Integer.toString(anoAtual - 88));
                anoMesAtual = anoAtual - 88;
                anoAtual = anoAtual - 100;
            } else if ((anoMesAtual > 200905)) {
                listaAnoMes.add(Integer.toString(anoMesAtual));
            }
        }
        return listaAnoMes;
    }

    /**
     * Rertorna o ano e o mes atual no Formato AAAAMM
     * @return
     */
    public static String getAnoMesAtual() {
        String data = "";
        try {
            Statement stm = JanelaLogin.getConnection().createStatement();
            ResultSet rs = stm.executeQuery("SELECT CURDATE();");
            if (rs.first()) {
                data = rs.getString(1).replace("-", "");
            }
            rs.close();
            stm.close();
        } catch (Exception e) {
        }
        return data.substring(0, 6);
    }

    public static int getMesAtual() {
        int mes = 0;
        try {
            Statement stm = JanelaLogin.getConnection().createStatement();
            ResultSet rs = stm.executeQuery("SELECT MONTH(CURDATE());");
            if (rs.first()) {
                mes = rs.getInt(1);
            }
            rs.close();
            stm.close();
        } catch (Exception e) {
        }
        return mes;
    }

    public static int getDiaAtual() {
        int dia = 0;
        try {
            Statement stm = JanelaLogin.getConnection().createStatement();
            ResultSet rs = stm.executeQuery("SELECT DAY(CURDATE());");
            if (rs.first()) {
                dia = rs.getInt(1);
            }
            rs.close();
            stm.close();
        } catch (Exception e) {
        }
        return dia;
    }

    public static String getAnoAtual() {
        String ano = "2008";
        try {
            Statement stm = JanelaLogin.getConnection().createStatement();
            ResultSet rs = stm.executeQuery("SELECT YEAR(CURDATE());");
            if (rs.first()) {
                ano = rs.getString(1);
            }
            rs.close();
            stm.close();
        } catch (Exception e) {
        }
        return ano;
    }

    /**
     * Classe para consultar a data do presente momento que esta no servidor do banco de dados
     * @return A data no formato AAAAMMDD
     */
    public static String getDataHojeFormatoBanco() {
        String data = "";
        try {
            Statement stm = JanelaLogin.getConnection().createStatement();
            ResultSet rs = stm.executeQuery("SELECT CURDATE();");
            if (rs.first()) {
                data = rs.getString(1).replace("-", "");
            }
            rs.close();
            stm.close();
        } catch (Exception e) {
        }
        return data;
    }

    /**
     * Classe para consultar a data do presente momento a data que esta no servidor do banco de dados
     * @return A data no formato DD-MM-AAAA
     */
    public static String getDataHojeFormatoNormal() {
        String data = "";
        try {
            Statement stm = JanelaLogin.getConnection().createStatement();
            ResultSet rs = stm.executeQuery("SELECT CURDATE();");
            if (rs.first()) {
                String aux[] = rs.getString(1).split("-");
                data = aux[2] + "/" + aux[1] + "/" + aux[0];
            }
            rs.close();
            stm.close();
        } catch (Exception e) {
        }
        return data;
    }

    /**
     * Converte a hora que esta no banco para um formato visual
     * @param hora parametro inscrito no formato HHMMSS
     * @return retorna a hora no formato HH:MM:SS
     */
    public static String formatarHoraBanco(String hora) {
        if (hora.length() != 6) {
            return "";
        } else {
            String h = hora.substring(0, 2);
            String m = hora.substring(2, 4);
            String s = hora.substring(4, 6);
            return (h + ":" + m + ":" + s);
        }
    }

    /**
     * Função para ter acesso a hora atual do banco de dados
     * @return retorna a hora atual no formato HHMMSS
     */
    public static String getHoraBanco() throws SQLException {
        String horario = "";
        Statement stm = JanelaLogin.getConnection().createStatement();
        ResultSet rs = stm.executeQuery("SELECT CURTIME();");
        if (rs.first()) {
            horario = rs.getString(1).replace(":", "");
        }
        rs.close();
        stm.close();
        return horario;

    }

    //Funcao para formatar a hora que vem do banco
    public static String formatarBancoHora(String hora) {
        if (hora.length() == 6) {
            String result = hora.substring(0, 2) + ":" + hora.substring(2, 4) + ":" + hora.substring(4, 6);
            return result;
        } else {
            return hora;
        }
    }

    public static String formatarBancoAnoMes(String anoMes) {
        String result = new String();
        if (anoMes.length() < 6) {
            result = "";
        } else {
            result = result.concat(anoMes.substring(4, 6) + "/" + anoMes.substring(0, 4));
        }
        return result;
    }

    public static String formatarDataBanco(String data) {
        data = data.replaceAll(" ", "");
        String[] partes = data.split("/");
        String result = new String();
        if (data.length() < 8) {
            result = "";
        } else {
            result = result.concat(partes[2]);
            result = result.concat(partes[1]);
            result = result.concat(partes[0]);
        }
        return result;
    }

    /**
     * Funçao para converter alguma data no formato a ser inserido no banco de dados
     * @param data no formato DD/MM/AAAA
     * @return data no formato AAAAMMDD
     */
    public static String formatarBancoData(String data) {
        String result = new String();
        if (data.length() < 8) {
            result = "";
        } else {
            result = result.concat(data.substring(6, 8) + "/" + data.substring(4, 6) + "/" + data.substring(0, 4));
        }
        return result;
    }

    /**
     * Seta os JComboBox com a data atual do banco de dados
     * @param comboBoxDay JComboBox que exibe o dia
     * @param comboBoxMonth JComboBox que exibe o mes
     * @param comboBoxYear JComboBox que exibe o ano
     */
    public static void setComboBoxDate(JComboBox comboBoxDay, JComboBox comboBoxMonth, JComboBox comboBoxYear) {
        setComboBoxDay(comboBoxDay);
        setComboBoxMonth(comboBoxMonth);
        setComboBoxYear(comboBoxYear);
    }

    /**
     * Função para setar o JComboBox com o dia atual do banco de dados
     * @param comboBoxDay JComboBox que exibe o dia atual
     */
    public static void setComboBoxDay(JComboBox comboBoxDay) {
        int dia = 0;
        try {
            Statement stm = JanelaLogin.getConnection().createStatement();
            ResultSet rs = stm.executeQuery("SELECT DAY(CURDATE());");
            if (rs.first()) {
                dia = rs.getInt(1);
            }
            rs.close();
            stm.close();
        } catch (Exception e) {
        }
        if (dia > 0) {
            dia--;
        }
        comboBoxDay.setSelectedIndex(dia);
    }
//Funcao para setar o comboBox ano com o ano atual

    public static void setComboBoxYear(JComboBox comboBoxYear) {
        String ano = "2008";
        try {
            Statement stm = JanelaLogin.getConnection().createStatement();
            ResultSet rs = stm.executeQuery("SELECT YEAR(CURDATE());");
            if (rs.first()) {
                ano = rs.getString(1);
            }
            rs.close();
            stm.close();
        } catch (Exception e) {
        }
        for (int i = 0; i < comboBoxYear.getItemCount(); i++) {
            if (ano.equals(comboBoxYear.getItemAt(i))) {
                comboBoxYear.setSelectedIndex(i);
                i = comboBoxYear.getItemCount();
            }
        }
    }
    //Funcao para setar o comboBox mes com o mes atual

    public static void setComboBoxMonth(JComboBox comboBoxMonth) {
        int mes = 0;
        try {
            Statement stm = JanelaLogin.getConnection().createStatement();
            ResultSet rs = stm.executeQuery("SELECT MONTH(CURDATE());");
            if (rs.first()) {
                mes = rs.getInt(1);
            }
            rs.close();
            stm.close();
            if (mes > 0) {
                mes--;
            }
        } catch (Exception e) {
        }
        comboBoxMonth.setSelectedIndex(mes);
    }

    public static int dataToInt(String data) {
        String inteiro = formatarDataBanco(data);

        try {
            int valor = Integer.parseInt(inteiro);
            return valor;
        } catch (Exception e) {
            return 0;
        }
    }

    public static boolean prazoEsgotado(String dataVencimento, int dias) {
        GregorianCalendar d1 = new GregorianCalendar();
        d1.set(GregorianCalendar.DATE, getDiaAtual());
        d1.set(GregorianCalendar.MONTH, getMesAtual());
        d1.set(GregorianCalendar.YEAR, Integer.parseInt(getAnoAtual()));
        int dia = d1.get(GregorianCalendar.DATE);
        int mes = d1.get(GregorianCalendar.MONTH);
        int ano = d1.get(GregorianCalendar.YEAR);
        String diaDiferente = Integer.toString(dia);
        if (dia < 10) {
            diaDiferente = "0" + Integer.toString(dia);
        }
        String mesDiferente = Integer.toString(mes);
        if (mes < 10) {
            mesDiferente = "0" + Integer.toString(mes);
        }
        String anoDiferente = Integer.toString(ano);
        if (diferencaEmDias(anoDiferente + mesDiferente + diaDiferente, dataVencimento) <= dias) {
            return true;
        } else {
            return false;
        }
    }

    public static int diferencaEmDias(String c1, String c2) {
        int ano1 = Integer.parseInt(c1.substring(0, 4));
        int ano2 = Integer.parseInt(c2.substring(0, 4));
        int mes1 = Integer.parseInt(c1.substring(4, 6));
        int mes2 = Integer.parseInt(c2.substring(4, 6));
        int dia1 = Integer.parseInt(c1.substring(6, 8));
        int dia2 = Integer.parseInt(c2.substring(6, 8));

        //calculando a diferença de dias entre as datas:
        GregorianCalendar d1 = new GregorianCalendar();
        d1.set(GregorianCalendar.DATE, dia1);
        d1.set(GregorianCalendar.MONTH, mes1);
        d1.set(GregorianCalendar.YEAR, ano1);
        d1.getTime();

        GregorianCalendar d2 = new GregorianCalendar();
        d2.set(GregorianCalendar.DATE, dia2);
        d2.set(GregorianCalendar.MONTH, mes2);
        d2.set(GregorianCalendar.YEAR, ano2);
        d2.getTime();

        long m1 = d1.getTimeInMillis();
        long m2 = d2.getTimeInMillis();
        int value = (int) ((m2 - m1) / (24 * 60 * 60 * 1000));
        return value;
    }

    public static String diferencaEmHoras(String c1, String c2) {
        int hora1 = Integer.parseInt(c1.substring(0, 2));
        int hora2 = Integer.parseInt(c2.substring(0, 2));
        int minuto1 = Integer.parseInt(c1.substring(2, 4));
        int minuto2 = Integer.parseInt(c2.substring(2, 4));
        int segundo1 = Integer.parseInt(c1.substring(4, 6));
        int segundo2 = Integer.parseInt(c2.substring(4, 6));

        //calculando a diferença de horas entre as datas:
        GregorianCalendar d1 = new GregorianCalendar();
        d1.set(GregorianCalendar.DATE, 0);
        d1.set(GregorianCalendar.MONTH, 0);
        d1.set(GregorianCalendar.YEAR, 0);
        d1.set(GregorianCalendar.HOUR, hora1);
        d1.set(GregorianCalendar.MINUTE, minuto1);
        d1.set(GregorianCalendar.SECOND, segundo1);

        GregorianCalendar d2 = new GregorianCalendar();
        d2.set(GregorianCalendar.DATE, 0);
        d2.set(GregorianCalendar.MONTH, 0);
        d2.set(GregorianCalendar.YEAR, 0);
        d2.set(GregorianCalendar.HOUR, hora2);
        d2.set(GregorianCalendar.MINUTE, minuto2);
        d2.set(GregorianCalendar.SECOND, segundo2);

        GregorianCalendar d3 = new GregorianCalendar();
        d3.set(GregorianCalendar.DATE, 0);
        d3.set(GregorianCalendar.MONTH, 0);
        d3.set(GregorianCalendar.YEAR, 0);
        d3.set(GregorianCalendar.HOUR, 4);
        d3.set(GregorianCalendar.MINUTE, 0);
        d3.set(GregorianCalendar.SECOND, 0);

        long m1 = d1.getTimeInMillis();
        long m2 = d2.getTimeInMillis();
        long dif = (m2 - m1);
        long seg = (dif / (1000));
        int hou = (int) (((seg / 60) / 60) % 60);
        int difHoras = 4 - hou;
        if (difHoras <= 0) {
            return "Prazo Esgotado";
        } else if (difHoras == 1) {
            return "Menos de 1 Hora";
        } else {
            return difHoras + " Horas";
        }
    }

    public static double diferencaEmDias(Date dataInicial, Date dataFinal) {
        double result = 0;
        long diferenca = dataFinal.getTime() - dataInicial.getTime();
        double diferencaEmDias = (diferenca / 1000) / 60 / 60 / 24; //resultado é diferença entre as datas em dias
        long horasRestantes = (diferenca / 1000) / 60 / 60 % 24; //calcula as horas restantes
        result = diferencaEmDias + (horasRestantes / 24d); //transforma as horas restantes em fração de dias

        return result;
    }

    public static double diferencaEmHoras(Date dataInicial, Date dataFinal) {
        double result = 0;
        long diferenca = dataFinal.getTime() - dataInicial.getTime();
        long diferencaEmHoras = (diferenca / 1000) / 60 / 60;
        long minutosRestantes = (diferenca / 1000) / 60 % 60;
        double horasRestantes = minutosRestantes / 60d;
        result = diferencaEmHoras + (horasRestantes);

        return result;
    }

    public static double diferencaEmMinutos(Date dataInicial, Date dataFinal) {
        double result = 0;
        long diferenca = dataFinal.getTime() - dataInicial.getTime();
        double diferencaEmMinutos = (diferenca / 1000) / 60; //resultado é diferença entre as datas em minutos
        long segundosRestantes = (diferenca / 1000) % 60; //calcula os segundos restantes
        result = diferencaEmMinutos + (segundosRestantes / 60d); //transforma os segundos restantes em minutos

        return result;
    }

    public static String prazoAtendimento(String dataCadastro, String dataAtual, String horaCadastro, String horaAtual, int diasPrazo) {
        //Data
        int diaInicial = Integer.parseInt(dataCadastro.substring(6, 8));
        int diaFinal = Integer.parseInt(dataAtual.substring(6, 8));
        int mesInicial = Integer.parseInt(dataCadastro.substring(4, 6));
        int mesFinal = Integer.parseInt(dataAtual.substring(4, 6));
        int anoInicial = Integer.parseInt(dataCadastro.substring(0, 4));
        int anoFinal = Integer.parseInt(dataAtual.substring(0, 4));
        //Hora
        int horaInicial = Integer.parseInt(horaCadastro.substring(0, 2));
        int horaFinal = Integer.parseInt(horaAtual.substring(0, 2));
        int minutoInicial = Integer.parseInt(horaCadastro.substring(2, 4));
        int minutoFinal = Integer.parseInt(horaAtual.substring(2, 4));
        int segundoInicial = Integer.parseInt(horaCadastro.substring(4, 6));
        int segundoFinal = Integer.parseInt(horaAtual.substring(4, 6));
        Date dataInicial = new Date();
        Date dataFinal = new Date();

        //Setar data
        dataInicial.setDate(diaInicial);
        dataInicial.setMonth(mesInicial);
        dataInicial.setYear(anoInicial);
        dataFinal.setDate(diaFinal);
        dataFinal.setMonth(mesFinal);
        dataFinal.setYear(anoFinal);
        //Setar horas
        dataInicial.setHours(horaInicial);
        dataInicial.setMinutes(minutoInicial);
        dataInicial.setSeconds(segundoInicial);
        dataFinal.setHours(horaFinal);
        dataFinal.setMinutes(minutoFinal);
        dataFinal.setSeconds(segundoFinal);

        double diferencaEmDias = diferencaEmDias(dataInicial, dataFinal);
        double diferencaEmHoras = diferencaEmHoras(dataInicial, dataFinal);

        if (diferencaEmDias < 0 || diferencaEmHoras < 0) {
            return "Erro";
        } else if (diasPrazo == 0) {
            if (diferencaEmDias < 2) {
                if (diferencaEmHoras < 4) {
                    double diferencaEmMinutos = (diferencaEmMinutos(dataInicial, dataFinal)) % 60;
                    if (diferencaEmHoras == 0) {
                        diferencaEmHoras = 1;
                    }
                    int horas = (int) (4.0 - diferencaEmHoras);
                    int min = 0;
                    if (diferencaEmMinutos != 0) {
                        min = (int) (60 - diferencaEmMinutos);
                    } else {
                        min = (int) (diferencaEmMinutos);
                    }
                    return Integer.toString(horas) + " Hora(s) " + Integer.toString(min) + " Minuto(s)";
                } else {
                    return "Prazo Esgotado";
                }
            } else {
                return "Prazo Esgotado";
            }
        } else {
            int diasRestantes = (int) (diasPrazo - diferencaEmDias);
            if (diasRestantes >= 0) {
                return Integer.toString(diasRestantes) + " Dia(s)";
            } else {
                return "Prazo Esgotado";
            }
        }
    }
}
